package com.alks.function.mapper.stockdept.pcfactorystockquery;

import com.alks.common.data.dto.SysUserTokenDTO;
import com.alks.entity.data.entity.*;
import com.alks.function.data.dto.PcMtlCheckFinReq;
import com.alks.function.data.dto.SurfaceInMaterialReq;
import com.alks.function.data.dto.finance.fincons.InboundDetailsDto;
import com.alks.function.data.dto.stockdept.pcfactorystockwork.*;
import com.alks.function.data.request.finance.ryfinance.MtlPreOtherInRequest;
import com.alks.function.data.request.stockdept.pcfactorystockwork.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.mapstruct.Mapper;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 材料暂收表 Mapper 接口
 * </p>
 *
 * @author ms
 * @since 2023-08-23
 */
@Mapper
public interface SD_SQ_PcMtlCheckMapper extends BaseMapper<PcMtlCheck> {
    /*查询材料未收数据*/
    List<PurUnSentDto> getPurUnSentQuery(@Param("request") MpPurDisRequest request, @Param("companyId") String companyId);

    /*材料未收入库之和*/
    Map<String, BigDecimal> getUnSentSumQuery(@Param("request") MpPurDisRequest request, @Param("companyId") String companyId);

    /*查询补料未收*/
    List<PurUnSentDto> getPurSpUnSentQuery(MpPurDisRequest request);

    /*查询补料未收数量和*/
    Map<String, Float> getSpUnSentSumQuery(MpPurDisRequest request);

    /*查询暂收数据*/
    List<PurSentDto> getPurSentQuery(@Param("request") MpPurDisRequest request, @Param("companyId") String companyId);

    /*求暂收入库和*/
    Float getSentSumQuery(MpPurDisRequest request, String companyId);

    /*查出新增暂收需要的数据*/
    List<PcMtlCheck> purSentQuery(List<AddPurSendRequest> request);

    /*查找用户的类型*/
    List<Map<String, String>> mtlTypeUserQuery(String user);

    /*查找全部的类型*/
    List<Map<String, String>> mtlTypeHeadQuery(String user);

    /*新增用户类型*/
    void sentMtlTypeAdd(List<PcUserMtlType> mtlTypes);

    /*删除用户类型*/
    void sentMtlTypeDelete(List<PcUserMtlType> requests);

    /*新增暂收*/
    void purSentAdd(List<PcMtlCheck> request);

    /*暂收数据入库批处理*/
    void purPutStockUpdate(@Param("checks") List<PcMtlCheck> checks);

    /*转入仓库*/
    void purStockUpdate(String recNo);

    /*更新数量数据*/
//    void purUnSentQtyUpdate(List<PurUnSendQtyRequest> request);

    /*更新备注*/
    void purSentRemark(List<PurSentRemarkRequest> request);

    /*取消暂收（修改）*/
    void purSentDelete(List<PurSentRequest> request);

    /*查询公司*/
    List<Map<String,String>> vendorQuery(@Param("companyId") String companyId);

    /*查询类型*/
    List<Map<String, String>> mtlTypeQuery(@Param("user") String user, @Param("companyId") String companyId);

    /*查询已检核*/
    List<PcRtCheckDto> getMtlRtCheckQuery(@Param("request") RtCheckRequest request, @Param("companyId") String companyId);

    /*找出已检核细节数据*/
    List<PcRtDetailDto> getMtlRtDetailQuery(RtLotRequest request);

    /*查询指令明细*/
    List<PcRtLotDto> getMtlRtLotQuery(RtLotRequest request);

    /*查询未检核*/
    List<PcRtUnCheckDto> getMtlRtUnCheckQuery(RtCheckRequest request);

    /*更新检核数据*/
    void MtlRtCheckUpdate(List<RtCheckUpRequest> request);

    /*批量退货处理*/
    void MtlRtPcUpdate(List<PcMtlCheck> checks);

    /*根据RecNo找出数据*/
    List<String> getByRecNo(String recNo);

    /**
     * 查询入库所需数据
     * @param recNo 入库单号
     * @param companyId 公司ID
     * @return 入库所需数据
     */
    List<PcMtlCheck> purStockUpdateQuery(String recNo, String companyId);

    List<PcMtlCheck2> getPcMtlCheckFin(PcMtlCheckFinReq req);

    List<PcMtlCheck2> getPcMtlCheckFinDetail(@Param("recNo") String recNo, @Param("companyId") String companyId);

    List<SdBomFitSub> getSdBomFitSub(@Param("mtlNo") String mtlNo, @Param("companyId") String companyId);

    void optionPcMtlCheck(@Param("list") List<PcMtlCheck2> list, @Param("choose") String choose, @Param("dto") SysUserTokenDTO dto);

    void clickPcMtlCheck(@Param("list") List<PcMtlCheck2> list, @Param("remark") String remark);

    void savePcMtlCheck(@Param("list") List<PcMtlCheck2> list);

    @Select("select distinct remark from PC_REC_SLIP_REAMRK2 where remark is not null")
    List<String> getDetails();

    @Select("select rec_no from PC_REC_SLIP_REAMRK2 where rec_no = #{recNo} and company_id = #{companyId}")
    String getListByRecNo(PcMtlCheck2 pcMtlCheck2);

    void updateRemark2(@Param("re") PcMtlCheck2 re, @Param("remark") String remark);

    void insertIntoRemark2(@Param("pcMtlCheck2") PcMtlCheck2 pcMtlCheck2, @Param("remark") String remark);

    List<PcMtlCheck2> getSurfaceMtl(SurfaceInMaterialReq req);

    BigDecimal getAcceptTotal(SurfaceInMaterialReq req);

    BigDecimal getAmtTotal(SurfaceInMaterialReq req);

    /**
     * 入库明细查询
     * @param request 入库明细条件
     * @param companyId 公司ID
     * @return 入库明细数据
     */
    List<InboundDetailsDto> mtlPreOtherInQuery(@Param("request") MtlPreOtherInRequest request, @Param("companyId") String companyId);


    List<InboundDetailsDto> mtlPreOtherInQuery2();

    /**
     * 入库明细总金额和总数查询
     * @param request 入库明细条件
     * @param companyId 公司ID
     * @return 入库明细有关数据之和
     */
    Map<String, BigDecimal> mtlPreOtherSumQuery(@Param("request") MtlPreOtherInRequest request, @Param("companyId") String companyId);

    /**
     * 结算作业查询
     * @param financeYymm 结算月份
     * @param accountName 结算方式
     * @param vendorName 厂商
     * @param companyId 公司ID
     * @param userName 用户名
     * @return 结算新增数据
     */
    List<PcApAmt> tempAddQuery(@Param("financeYymm") String financeYymm, @Param("accountName") String accountName, @Param("vendorName") String vendorName, @Param("companyId") String companyId, @Param("userName") String userName);

    /**
     * 结算作业删除回滚
     * @param slipNo 结算单号
     * @param companyId 公司ID
     */
    void tempDel(@Param("slipNo") String slipNo, @Param("companyId") String companyId);

    /**
     * 结算作业写入结算单号
     *
     * @param financeYymm 结算月份
     * @param accountName 结算方式
     * @param recNoList  订单号
     * @param balanceNo   结算单号
     * @param companyId   公司ID
     */
    void tempAddUp(@Param("financeYymm") String financeYymm, @Param("accountName") String accountName, @Param("recNoList") List<String> recNoList, @Param("balanceNo") String balanceNo, @Param("companyId") String companyId);

    BigDecimal getUnitPrice(PcMtlCheck2 pcMtlCheck2);

    /**
     * 获取指定订单已入库数量
     * @return 键：slipNo_mtlNo,值：sendQty
     */
    Map<String, Object> getPurPutStockQuery(List<AddPurSendRequest> request, String companyId);

    /*查询当日审核单据数量*/
    Integer getPcMtlCheckCfmCount(String companyId);
}
